package main

import (
	"fmt"
)

// 1,求n的阶乘。 至少使用递归函数完成一次
// （1）循环版
func factorial1(n int) int {
	switch {
	case n < 0:
		panic("n is negative")
	case n == 0:
		return 1
	}
	r := 1
	for i := 1; i <= n; i++ {
		r *= i
	}
	return r
}

// (2) 递归版
func factorial2(n int) int {
	if n < 0 {
		panic("n is negative")
	} else if n == 0 {
		return 1
	}
	return factorial2(n-1) * n
}

// (3) 循环改递归版
func factorial3(n, b int) int {
	if n < 0 {
		panic("n is negative")
	} else if n == 0 {
		return b
	}
	return factorial3(n-1, n*b)
}

//2、 编写一个函数， 接受一个参数n, n为正整数， 要求数字必须对齐

func upperTriangula(n int) {
	lastline := ""
	for i := 1; i <= n; i++ {
		lastline += fmt.Sprintf("%d ", i)
	}

	width := len(lastline)
	for i := 1; i <= n; i++ {
		line := ""
		for j := i; j >= 1; j-- {
			line += fmt.Sprintf("%d", j) + " "
		}
		fmt.Printf("%[2]*[1]s\n", line, width)

	}
}

func main() {
	// n1 := factorial1(20)
	// fmt.Println(n1)
	// n2 := factorial2(20)
	// fmt.Println(n2)
	// n3 := factorial3(20, 1)
	// fmt.Println(n3)
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~")
	upperTriangula(-2)
}


// 批改意见
// 输出倒三角时没有考虑n<=0的特殊情况